﻿using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RuanRang.Core.Compression.Zip;

namespace ZipTest
{
    [TestClass]
    public class ZipFileTest
    {
        /// <summary>
        /// Tests the zip method.
        /// </summary>
        [TestMethod]
        public void TestZipMethod()
        {
            // Depending on the directory this could be very large and would require more attention
            // in a commercial package.
            var filenames = Directory.GetFiles(@"D:\My Flash\25231\25231\flash");
            // 'using' statements guarantee the stream is closed properly which is a big source
            // of problems otherwise.  Its exception safe as well which is great.
            using (var s = new ZipOutputStream(File.Create(@"D:\demo.zip")))
            {
                s.SetLevel(9); // 0 - store only to 9 - means best compression
                var buffer = new byte[4096];
                foreach (var file in filenames)
                {
                    // Using GetFileName makes the result compatible with XP
                    // as the resulting path is not absolute.
                    var entry = new ZipEntry(Path.GetFileName(file));

                    // Setup the entry data as required.

                    // Crc and size are handled by the library for seakable streams
                    // so no need to do them here.

                    // Could also use the last write time or similar for the file.
                    entry.DateTime = DateTime.Now;
                    s.PutNextEntry(entry);

                    using (var fs = File.OpenRead(file))
                    {
                        // Using a fixed size buffer here makes no noticeable difference for output
                        // but keeps a lid on memory usage.
                        int sourceBytes;
                        do
                        {
                            sourceBytes = fs.Read(buffer, 0, buffer.Length);
                            s.Write(buffer, 0, sourceBytes);
                        } while (sourceBytes > 0);
                    }
                }

                // Finish/Close arent needed strictly as the using statement does this automatically

                // Finish is important to ensure trailing information for a Zip file is appended.  Without this
                // the created file would be invalid.
                s.Finish();

                // Close is important to wrap things up and unlock the file.
                s.Close();
            }
        }
    }
}
